package pe.edu.upc.dew.bibliotecaweb.controller;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import pe.edu.upc.dew.bibliotecaweb.dao.LibroDao;
import pe.edu.upc.dew.bibliotecaweb.model.Libro;
import pe.edu.upc.dew.bibliotecaweb.model.Persona;
import pe.edu.upc.dew.bibliotecaweb.model.Reserva;
import pe.edu.upc.dew.bibliotecaweb.service.ReservaService;

/**
 * @author DEW 2010
 * Acción encargada de realizar las validaciones y llamadas necesarias para llevar a cabo el registro de una reserva
 */
public class ReservaAction extends org.apache.struts.action.Action {

    private static final String SUCCESS = "success"; // reserva concretada
    private static final String NOUSER = "nouser"; // no hay usuario en la sesión
    private static final String FAILURE = "failure"; // no se ha seleccionado un libro
    private ReservaService reservaService;

    /**
     *Constructor de la clase ReservaAction
     */
    public ReservaAction() {
        this.reservaService = new ReservaService();
    }

    /**
     * Lógica y validaciones para el registro de una reserva.
     * Acciones:
     * SUCCESS      La reserva se registra de manera correcta.
     * NOUSER       La acción no encontró en la sesión un usuario; se redirecciona a la página de inicio de sesión.
     * FAILURE      No se registró la reserva por falta de datos (fecha de reserva, libro a reservar o reserva activa).
     * @param mapping   permite realizar los redireccionamientos, en base a la asociación y configuración hecha en el archivo struts-config.xml.
     * @param form      permite acceder a los campos del formulario de Reserva (bookCatalogue).
     * @param request   trae el request generado al realizar el submit desde el formulario de Reserva.
     */
    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        // Recupero las variables del JSP
        ReservaForm datosForm = (ReservaForm) form;
        String fechaReserva = datosForm.getFechaReserva();
        // Creamos una sesión
        HttpSession session = (HttpSession) request.getSession();
        Persona persLogin = (Persona) session.getAttribute("persona");
        String idLibro = request.getParameter("idLibroAReservar").toString();
        String numEjem = request.getParameter("numEjem").toString();
        if (session.getAttribute("persona") == null) {
            return mapping.findForward(NOUSER);
        } else if (idLibro != null && idLibro.equals("") || numEjem != null && numEjem.equals("")) {
            datosForm.setMensajeR("Debe seleccionar un libro antes de intentar registrar la reserva.");
            return mapping.findForward(FAILURE);
        } else if (fechaReserva != null && fechaReserva.equals("")) {
            datosForm.setMensajeR("Debe seleccionar una fecha de reserva para el libro.");
            return mapping.findForward(FAILURE);
        } else if (reservaService.buscaReservaUsuario(persLogin.getUsuarioPersona()) != null) {
            datosForm.setMensajeR("Usted ya tiene una reserva activa registrada.");
            return mapping.findForward(FAILURE);
        } else {
            if (Integer.parseInt(numEjem) < 1) {
                datosForm.setMensajeR("El libro seleccionado no cuenta con ejemplares disponibles en este momento.");
                return mapping.findForward(FAILURE);
            } else {
                String currentDate = getDateTime();
                LibroDao libroDao = new LibroDao();
                Libro libroReservado = libroDao.getLibroPorId(Integer.parseInt(idLibro));
                request.setAttribute("libroReservado", libroReservado);
                Reserva reserva = new Reserva();
                reserva.setFechaEjecutaReserva(currentDate);
                reserva.setFechaReserva(fechaReserva);
                reserva.setLibro(libroReservado);
                reserva.setEstadoReserva('A');
                reserva.setPersona(persLogin);
                reservaService.reservaLibro(reserva);
                reservaService.actualizaEstados();
                datosForm.setMensajeR("Reserva realizada satisfactoriamente");
                return mapping.findForward(SUCCESS);
            }
        }
    }

    /**
     * Método que permite obtener el día actual como cadena de texto, en el formato de fecha específicado.
     * @return  Retorna una cadena con la fecha actual
     */
    private String getDateTime() {
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date date = new Date();
        return dateFormat.format(date);
    }
}
